package com.hwy.jmh;

import com.hwy.jmh.bean.JsonBean;
import com.hwy.jmh.json.impl.FastjsonImpl;
import com.hwy.jmh.json.impl.GsonImpl;
import com.hwy.jmh.json.impl.JacksonImpl;
import com.hwy.jmh.json.Json;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.concurrent.TimeUnit;

/**
 * 示例：http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
 *
 * @Author hweiyu
 * @Description
 * @Date 2022/2/7 17:20
 */
//接口的指标
@BenchmarkMode({Mode.All})
//预热1次，每次执行2秒钟
@Warmup(iterations = 1, time = 2)
//测量1次，每次测量的持续时间为10秒
@Measurement(iterations = 1, time = 10)
//使用1个线程来执行基准测试方法
@Threads(1)
//指定fork出1个子进程来执行同一基准测试方法
@Fork(1)
//每个测试线程分配一个实例
@State(Scope.Thread)
//时间单位，毫秒
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class JsonTest {

    private Json gson;

    private Json fast;

    private Json jack;

    private String jsonStr;

    /**
     * 初始化阶段
     */
    @Setup
    public void init() {
        gson = new GsonImpl();
        fast = new FastjsonImpl();
        jack = new JacksonImpl();
        jsonStr = "{\"a\":1,\"b\":\"1\",\"c\":{\"d\":true,\"e\":\"1\"},\"f\":[{\"g\":\"1\",\"h\":\"1\"}],\"i\":[\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\"]}";
    }

    /**
     * 销毁，结束阶段
     */
    @TearDown
    public void finish() {

    }

    @Benchmark
    public void testGson() {
        test(gson, jsonStr, JsonBean.class);
    }

    @Benchmark
    public void testFast() {
        test(fast, jsonStr, JsonBean.class);
    }

    @Benchmark
    public void testJack() {
        test(jack, jsonStr, JsonBean.class);
    }

    private void test(Json json, String jsonStr, Class cls) {
        json.toStr(json.toBean(jsonStr, cls));
    }

    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(JsonTest.class.getSimpleName())
                //生成json格式报告
                .result("jmh.json")
                .resultFormat(ResultFormatType.JSON)
                .build();
        new Runner(opt).run();
    }
}
